package com.antifly.common.utils;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.converters.longconverter.LongNumberConverter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.antifly.common.exception.bizException.BizException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * @author LuoJiaHui
 * @date 2022/5/9 9:14
 * @description
 */
public class ExcelUtils {
    private ExcelUtils() {
    }

    private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);

    /**
     * 文件下载并且失败的时候返回json（默认失败了会返回一个有部分数据的Excel）
     * 根据模板填充Excel;不考虑格式
     *
     * @param data     写入数据
     * @param fileName excel文件名称
     * @param response 响应对象
     * @since 2.1.1
     */
    public static void downloadFailedUsingJson(HttpServletResponse response, List<?> data,
                                               InputStream templateInputStream, String fileName) {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            fileName = URLEncoder.encode(fileName, "UTF-8").replace("\\+", "%20");
            response.setHeader("Content-disposition",
                    "attachment;filename*=utf-8''" + fileName + ExcelTypeEnum.XLSX.getValue());
            // 这里需要设置不关闭流
            EasyExcelFactory.write(response.getOutputStream())
                    .withTemplate(templateInputStream)
                    .autoCloseStream(Boolean.FALSE)
                    .sheet(0)
                    .doFill(data);
        } catch (Exception e) {
            log.info("下载文件失败=>{}", e.getMessage());
            throw new BizException("下载文件失败");
        }
    }

    /**
     * 根据数据写出Excel
     *
     * @param response  响应对象
     * @param data      源数据
     * @param clazz     模型类
     * @param fileName  文件名称
     * @param sheetName 工作页名称
     * @author LuoJiaHui
     * @date 2022/5/9 14:02
     **/
    public static void downloadFailedUsingJson(HttpServletResponse response, List<?> data, Class<?> clazz,
                                               String fileName, String sheetName) {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            fileName = URLEncoder.encode(fileName, "UTF-8").replace("\\+", "%20");
            response.setHeader("Content-disposition",
                    "attachment;filename*=utf-8''" + fileName + ExcelTypeEnum.XLSX.getValue());
            // 这里需要设置不关闭流
            EasyExcelFactory.write(response.getOutputStream(), clazz)
                    .registerConverter(new LongNumberConverter())
                    .sheet(sheetName)
                    .doWrite(data);
        } catch (Exception e) {
            log.info("下载文件失败=>{}", e.getMessage());
            throw new BizException("下载文件失败");
        }
    }
}
